package org.nf.db.util;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author wangl
 * @date 2021/7/28
 * 结果集的行处理器，将一条记录转换为指定的类型
 */
public class RowProcessor {

    /**
     * 根据列的下标获取结果集中的某一列转换为具体的值
     */
    public static Object toValue(ResultSet rs, int columnIndex) throws SQLException{
        return rs.getObject(columnIndex);
    }

    /**
     * 根据列的名称获取结果集中的某一列转换为具体的值
     */
    public static Object toValue(ResultSet rs, String columnName) throws SQLException{
        return rs.getObject(columnName);
    }

    /**
     * 将结果集转换为Array
     */
    public static Object[] toArray(ResultSet rs) throws SQLException{
        Object[] result = new Object[rs.getMetaData().getColumnCount()];
        for(int i = 0; i < result.length; i++) {
            result[i] = rs.getObject(i + 1);
        }
        return result;
    }

    /**
     * 将结果集转换为map
     */
    public static Map<String, Object> toMap(ResultSet rs) throws SQLException {
        //实例化化map
        Map<String, Object> result = new HashMap<>();
        //通过结果集来获取结果集的元数据（MetaData）结构，为了获取表的列名
        ResultSetMetaData metaData = rs.getMetaData();
        //使用for循环取出所有的列
        for(int i = 1; i<=metaData.getColumnCount(); i++) {
            //metaData.getColumnLabel(i)获取当前列的名称
            //rs.getObject(i)获取当前列的值
            result.put(metaData.getColumnLabel(i), rs.getObject(i));
        }
        //返回
        return result;
    }

    /**
     * 将结果集转换为一个Bean对象
     */
    public static <T> T toBean(ResultSet rs, Class<T> beanClass) throws SQLException{
        return BeanProcessor.createBean(rs, beanClass);
    }
}
